'use strict';


const Controller = require('egg').Controller;

class UserController extends Controller {


  // 注册用户
  async create() {
    const { ctx, app } = this;
    // 验证用户名和密码
    ctx.validate({ user_name: app.validate.user.user_name, password: app.validate.user.password });
    const res = await ctx.service.admin.user.createUser(ctx.request.body);
    res ? ctx.helper.success('用户注册成功', { id: res.id, user_name: res.user_name }) : ctx.helper.error('用户注册失败', 400);
  }

  // 用户登录
  async login() {
    const { ctx, app } = this;
    // 1获取用户名和密码数据
    const { user_name, password } = ctx.request.body;

    // 2验证用户名和密码
    ctx.validate({ user_name: app.validate.user.user_name, password: app.validate.user.password });

    // 1,判断用户是否存在 不存在 报错
    try {
      const res = await ctx.service.admin.user.getUserInfo({ user_name });
      if (!res) return ctx.helper.error('账号或密码错误', 400);


      if (res.status === false) return ctx.helper.error('您已被管理员拉入黑名单!  如有疑问请联系管理员', 401);

      // 2，密码是否匹配 不匹配  报错
      const checked = await ctx.compare(password, res.password);
      if (!checked) return ctx.helper.error('账号或密码错误 密码不正确', 400);

      // 3, 登录成功生成token;
      const user = { ...res, password: '', paypassword: '' };
      const tokenUser = { id: res.id, name: res.user_name, email: res.email, mobile: res.mobile, is_admin: res.is_admin };
      ctx.helper.success('登录成功', {
        userInfo: user,
        token: ctx.helper.getToken(tokenUser),
      });

    } catch (error) {
      console.error(error);
      ctx.helper.error('登录异常', 400);
    }
  }

  // 获取用户列表
  async index() {
    const { ctx, app } = this;
    // 1获取数据
    const { pageNum = 1, pageSize = 10 } = ctx.request.query;
    // 2验证数据
    ctx.validate({ pageNum: app.validate.user.pageNum, pageSize: app.validate.user.pageSize }, ctx.request.query);
    const res = await ctx.service.admin.user.getUserList(pageNum, pageSize);
    res ? ctx.helper.success('获取用户列表成功', res) : ctx.helper.error('获取用户列表失败', 400);
  }


  // 获取用户资料
  async show() {
    const { ctx } = this;
    const id = ctx.params.id;
    const res = await ctx.service.admin.user.getUserInfo({ id });
    res ? ctx.helper.success('获取成功', res) : ctx.helper.error('获取失败', 400);
  }

  // 修改用户信息 根据id修改
  async update() {
    const { ctx } = this;
    // TODO:  2验证规则待添加
    // ctx.validate({ user_name: app.validate.user.user_name, password: app.validate.user.password });
    // 3密码/支付密码 加密
    if (ctx.request.body.password) {
      ctx.request.body.password = await ctx.genHash(ctx.request.body.password);
    }
    if (ctx.request.body.paypassword) {
      ctx.request.body.paypassword = await ctx.genHash(ctx.request.body.paypassword);
    }
    // 4操作数据库
    const res = await ctx.service.admin.user.updatedUser(ctx.params.id, ctx.request.body);
    res ? ctx.helper.success('修改用户信息成功') : ctx.helper.error('操作的用户不存在', 404);
  }

  //   删除用户
  async destroy() {
    const { ctx } = this;
    console.log(ctx.request.body);
    console.log(ctx.request.query);
    const res = await ctx.service.admin.user.removeUser(ctx.request.body);

    res ? ctx.helper.success('删除用户成功') : ctx.helper.error('删除用户失败', 400);
  }

  // 用户修改密码
  async changePassword() {
    const { ctx, app } = this;
    // 1,获取信息
    const id = ctx.state.user.id;
    const opassword = ctx.request.body.opassword;
    const newpassword = ctx.request.body.newpassword;
    // 2,验证
    ctx.validate({ newpassword: app.validate.user.password }, ctx.request.body);
    // 2根据id获取用户信息
    const res = await ctx.service.admin.user.getUserInfo({ id });

    // 3，原密码是否与数据库中的密码匹配 不匹配  报错
    const checked = await ctx.compare(opassword, res.password);
    console.log('原密码密码错误');
    if (!checked) return ctx.helper.error('原密码密码错误', 400);

    // 4，判断新密码与老密码是否一致
    if (opassword === newpassword) return ctx.helper.error('新密码与旧密码不能一致', 400);
    console.log('新密码与旧密码不能一致');

    // 5加密新密码
    const password = await ctx.genHash(newpassword);

    // 6,操作数据库修改密码
    const ress = await ctx.service.admin.user.updatedUserPwd(id, password);
    ress && res[0] !== 0 ? ctx.helper.success('修改密码成功') : ctx.helper.error('修改密码失败', 400);
  }

  // 用户修改支付密码
  async upPayPassword() {
    const { ctx, app } = this;
    // 1,获取信息
    const id = ctx.state.user.id;
    const opassword = ctx.request.body.opassword;
    const newpassword = ctx.request.body.newpassword;
    // 2,验证
    ctx.validate({ newpassword: app.validate.user.password }, ctx.request.body);
    // 2根据id获取用户信息
    const res = await ctx.service.admin.user.getUserInfo({ id });

    // 3，原密码是否与数据库中的密码匹配 不匹配  报错
    const checked = await ctx.compare(opassword, res.paypassword);
    console.log('原支付密码密码错误');
    if (!checked) return ctx.helper.error('原支付密码密码错误', 400);

    // 4，判断新密码与老密码是否一致
    if (opassword === newpassword) return ctx.helper.error('新支付密码与旧密码不能一致', 400);
    console.log('新支付密码与旧密码不能一致');

    // 5加密新密码
    const password = await ctx.genHash(newpassword);

    // 6,操作数据库修改密码
    const ress = await ctx.service.admin.user.upPayPassword(id, password);
    ress && res[0] !== 0 ? ctx.helper.success('修改密码成功') : ctx.helper.error('修改密码失败', 400);
  }

  // 给用户设置角色
  async setRoles() {
    const ctx = this.ctx;
    const res = await ctx.service.admin.user.setRoles(ctx.request.body);
    res ? ctx.helper.success('设置角色成功') : ctx.helper.error('设置角色失败！', 400);
  }


}

module.exports = UserController;
